home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / csup / math_support / ffparnd.asm < prev    next >
Assembly Source File  |  1994-02-14  |  7KB  |  157 lines

  1. *        TTL       FAST FLOATING POINT ASCII ROUND ROUTINE (FFPARND)
  2. ****************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC.  *
  4. ****************************************
  5.  
  6. ***********************************************
  7. *                  FFPARND                    *
  8. *           ASCII ROUND SUBROUTINE            *
  9. *                                             *
  10. *  THIS ROUTINE IS NORMALLY CALLED AFTER THE  *
  11. *  'FFPFPA' FLOAT TO ASCII ROUTINE AND ACTS   *
  12. *  UPON ITS RESULTS.                          *
  13. *                                             *
  14. *  INPUT:  D6 - ROUNDING MAGNITUDE IN BINARY  *
  15. *               AS EXPLAINED BELOW.           *
  16. *          D7 - BINARY REPRESENTATION OF THE  *
  17. *               BASE 10 EXPONENT.             *
  18. *          SP ->  RETURN ADDRESS AND OUTPUT   *
  19. *                 FROM FFPFPA ROUTINE         *
  20. *                                             *
  21. *  OUTPUT: THE ASCII VALUE ON THE STACK IS    *
  22. *          CORRECTLY ROUNDED                  *
  23. *                                             *
  24. *          THE CONDITION CODES ARE UNDEFINED  *
  25. *                                             *
  26. *          ALL REGISTERS TRANSPARENT          *
  27. *                                             *
  28. *     THE ROUNDING PRECISION REPRESENTS THE   *
  29. *     POWER OF TEN TO WHICH THE ROUNDING WILL *
  30. *     OCCUR.  (I.E. A -2 MEANS ROUND THE DIGIT*
  31. *     IN THE HUNDREDTH POSITION FOR RESULTANT *
  32. *     ROUNDING TO TENTHS.)  A POSITIVE VALUE  *
  33. *     INDICATES ROUNDING TO THE LEFT OF THE   *
  34. *     DECIMAL POINT (0 IS UNITS, 1 IS TENS    *
  35. *     E.T.C.)                                 *
  36. *                                             *
  37. *     THE BASE TEN EXPONENT IN BINARY IS D7   *
  38. *     FROM THE 'FFPFPA' ROUTINE OR COMPUTED BY*
  39. *     THE CALLER.                             *
  40. *                                             *
  41. *     THE STACK CONTAINS THE RETURN ADDRESS   *
  42. *     FOLLOWED BY THE ASCII NUMBER AS FROM    *
  43. *     THE 'FFPFPA' ROUTINE.  SEE THE          *
  44. *     DESCRIPTION OF THAT ROUTINE FOR THE     *
  45. *     REQUIRED FORMAT.                        *
  46. *                                             *
  47. *  EXAMPLE:                                   *
  48. *                                             *
  49. *  INPUT PATTERN '+.98765432+01' = 9.8765432  *
  50. *                                             *
  51. *     ROUND +1 IS +.00000000+00 =  0.         *
  52. *     ROUND  0 IS +.10000000+02 = 10.         *
  53. *     ROUND -1 IS +.10000000+02 = 10.         *
  54. *     ROUND -2 IS +.99000000+01 =  9.9        *
  55. *     ROUND -3 IS +.98800000+01 =  9.88       *
  56. *     ROUND -6 IS +.98765400+01 =  9.87654    *
  57. *                                             *
  58. *  NOTES:                                     *
  59. *     1) IF THE ROUNDING DIGIT IS TO THE LEFT *
  60. *        OF THE MOST SIGNIFICANT DIGIT, A ZERO*
  61. *        RESULTS.  IF THE ROUNDING DIGIT IS TO*
  62. *        THE RIGHT OF THE LEAST SIGNIFICANT   *
  63. *        DIGIT, THEN NO ROUNDING OCCURS       *
  64. *     2) ROUNDING IS HANDY FOR ELIMINATING THE*
  65. *        DANGLING '999...' PROBLEM COMMON WITH*
  66. *        FLOAT TO DECIMAL CONVERSIONS.        *
  67. *     3) POSITIONS FROM THE ROUNDED DIGIT AND *
  68. *        TO THE RIGHT ARE SET TO ZEROES.      *
  69. *     4) THE EXPONENT MAY BE AFFECTED.        *
  70. *     5) ROUNDING IS FORCED BY ADDING FIVE.   *
  71. *     6) THE BINARY EXPONENT IN D7 MAY BE     *
  72. *        PRE-BIASED BY THE CALLER TO PROVIDE  *
  73. *        ENHANCED EDITING CONTROL.            *
  74. *     7) THE RETURN ADDRESS IS REMOVED FROM   *
  75. *        THE STACK UPON EXIT.                 *
  76. ***********************************************
  77.          PAGE
  78. *FFPARND  IDNT      1,1       FFP ASCII ROUND SUBROUTNE
  79.  
  80. *         OPT       PCS
  81.  
  82.          XDEF      FFPARND   ENTRY POINT
  83.  
  84.  
  85. FFPARND  MOVEM.L   D7/A0,-(SP)         SAVE WORK ON STACK
  86.          SUB.W     D6,D7               COMPUTE ROUNDING DIGIT OFFSET
  87.          BLE.S     FAFZRO              BRANCH IF LARGER THAN VALUE
  88.          CMP.W     #8,D7               INSURE NOT PAST LAST DIGIT
  89.          BHI       FARTN               RETURN IF SO
  90.          LEA       8+4+1(SP,D7),A0     POINT TO ROUNDING DIGIT
  91.          CMP.B     #'5',(A0)           ? MUST ROUNDUP
  92.          BCC.S     FADORND             YES, ROUND
  93.          SUBQ.W    #1,D7               ? ROUND LEADING DIGIT ZERO (D7=1)
  94.          BNE.S     FAZEROL             NO, ZERO IT OUT
  95. FAFZRO   LEA       8+4+2(SP),A0        FORCE ZEROES ALL THE WAY ACROSS
  96.          MOVE.L    #'E+00',8+4+10(SP)  FORCE ZERO EXPONENT
  97.          MOVE.B    #'+',8+4(SP)        ZERO IS ALWAYS POSITIVE
  98.          BRA.S     FAZEROL             ZERO MANTISSA THEN RETURN
  99.  
  100. * ROUND UP MUST OCCUR
  101. FADORND  MOVE.L    A0,-(SP)            SAVE ZERO START ADDRESS ON STACK
  102. FACARRY  CMP.B     #'.',-(A0)          ? HIT BEGINNING
  103.          BEQ.S     FASHIFT             YES, SHIFT DOWN
  104.          ADDQ.B    #1,(A0)             LOOK AT NEXT CHARACTER
  105.          CMP.B     #'9'+1,(A0)         ? PAST NINE
  106.          BNE.S     FAZERO              NO, NOW ZERO THE END
  107.          MOVE.B    #'0',(A0)           FORCE ZERO FOR OVERFLOW
  108.          BRA.S     FACARRY             LOOP FOR CARRY
  109.  
  110. * OVERFLOW PAST TOP DIGIT - SHIFT RIGHT AND UP EXPONENT
  111. FASHIFT  ADDQ.L    #1,(SP)             ZERO PAD STARTS ONE LOWER NOW
  112.          ADDQ.L    #1,A0               BACK TO LEADING DIGIT
  113.          MOVEQ     #$31,D7             DEFAULT FIRST DIGIT ASCII ONE
  114.          SWAP.W    D7                  INITIALIZE OLD DIGIT
  115.          MOVE.B    (A0),D7             PRE-LOAD CURRENT DIGIT
  116. FASHFTR  SWAP.W    D7                  TO PREVIOUS DIGIT
  117.          MOVE.B    D7,(A0)+            STORE INTO THIS POSITION
  118.          MOVE.B    (A0),D7             LOAD UP NEXT DIGIT
  119.          CMP.B     #'E',D7             ? THE END
  120.          BNE.S     FASHFTR             NO, SHIFT ANOTHER TO THE RIGHT
  121.  
  122. * INCREMENT EXPONENT FOR SHIFT RIGHT
  123.          CMP.B     #'+',1(A0)          ? POSITIVE EXPONENT
  124.          ADDQ.L    #3,A0               POINT TO LEAST EXP DIGIT
  125.          BNE.S     FANGEXP             BRANCH NEGATIVE EXPONENT
  126.          ADDQ.B    #1,(A0)             ADD ONE TO EXPONENT
  127.          CMP.B     #'9'+1,(A0)         ? OVERFLOW PAST NINE
  128.          BNE.S     FAZERO              NO, NOW ZERO
  129.  
  130.          SUB.B       #10,(A0)               ADJUST BACK                            V1.4/V1.5
  131.  
  132.          ADDQ.B    #1,-(A0)            CARRY TO NEXT DIGIT
  133.          BRA.S     FAZERO              AND NOW ZERO END
  134. FANGEXP  CMP.W     #'01',-1(A0)        ? GOING FROM 1 TO +0
  135.          BNE.S     FANGOK              BRANCH IF NO
  136.          MOVE.B    #'+',-2(A0)         CHANGE MINUS TO PLUS
  137. FANGOK   SUBQ.B    #1,(A0)             SUBTRACT ON FROM EXPONENT
  138.          CMP.B     #'0'-1,(A0)         ? UNDERFLOW BELOW ZERO
  139.          BNE.S     FAZERO              NO, ZERO REMAINDER
  140.  
  141.          ADD.B       #10,(A0)               ADJUST BACK                            V1.4
  142.  
  143.          SUBQ.B    #1,-(A0)            BORROW FROM NEXT DIGIT
  144.  
  145. * ZERO THE DIGITS PAST PRECISION REQUIRED
  146. FAZERO   MOVE.L    (SP)+,A0            RELOAD SAVED PRECISION
  147. FAZEROL  CMP.B     #'E',(A0)           ? AT END
  148.          BEQ.S     FARTN               BRANCH IF SO
  149.          MOVE.B    #'0',(A0)+          ZERO NEXT DIGIT
  150.          BRA.S     FAZEROL             AND TEST AGAIN
  151.  
  152. * RETURN TO THE CALLER
  153. FARTN    MOVEM.L   (SP)+,D7/A0         RESTORE REGISTERS
  154.          RTS                           RETURN
  155.  
  156.          END
  157.